package com.wang.spring.basic_dl.d_withannotation;

import com.wang.spring.basic_dl.d_withannotation.bean.Cat;
import com.wang.spring.basic_dl.d_withannotation.bean.Dog;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 *  这个类演示了延迟查找的功能
 */
public class LazyLookupApplication {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:basic_dl/quickstart-lazylookup.xml");
        Cat cat = ctx.getBean(Cat.class);
        System.out.println(cat);

        /**
         * 获取一个bean的时候 先不报错，不管这个Dog存不存在，先拿一个包装给我拿着，等到用的时候在拆开看看里面到底有没有对象，
         * ObjectProvider 可以实现延迟查找
         * 如果 ctx.getBean(Dog.class) 这么调用，那么会报错，没有这个bean存在，NoSuchBeanDefinitionException
         * 但是下面这么调用不会出错
         *
         * 这种方式 可能在封装底层的插件的时候 会用到
         */
        ObjectProvider<Dog> beanProvider = ctx.getBeanProvider(Dog.class);
        Dog dog = beanProvider.getIfAvailable();
        if (dog == null) {
            dog = new Dog();
        }
        // 下面这两种方式 是java 8 的书写方式
//        beanProvider.getIfAvailable(() -> new Dog());
//        beanProvider.getIfAvailable(Dog::new);

    }
}
